using UnityEngine;
using System.Collections.Generic;
using Newtonsoft.Json;
using System.IO;
using System;

/// <summary>
/// OptimizedHexGridCompatible 类的数据序列化辅助类
/// 用于将六边形网格数据转换为JSON格式供外部算法使用
/// </summary>
public static class OptimizedHexGridSerializer
{
    /// <summary>
    /// 将 OptimizedHexGridCompatible 中的数据序列化为 JSON 字符串
    /// </summary>
    /// <param name="hexGrid">要序列化的六边形网格实例</param>
    /// <returns>序列化后的 JSON 字符串</returns>
    public static string SerializeToJson(OptimizedHexGrid hexGrid)
    {
        if (hexGrid == null)
        {
            Debug.LogError("OptimizedHexGridCompatible 实例为空，无法序列化");
            return null;
        }

        // 创建要序列化的数据模型
        var dataModel = new HexGridModel(hexGrid);

        // 序列化数据
        var json = JsonConvert.SerializeObject(dataModel, new VectorConverter());
        return json;
    }

    /// <summary>
    /// 将 OptimizedHexGridCompatible 中的数据序列化为 JSON 文件
    /// </summary>
    /// <param name="hexGrid">要序列化的六边形网格实例</param>
    /// <param name="filePath">保存的文件路径</param>
    /// <returns>是否保存成功</returns>
    public static bool SerializeToJsonFile(OptimizedHexGrid hexGrid, string filePath)
    {
        try
        {
            string json = SerializeToJson(hexGrid);
            if (string.IsNullOrEmpty(json))
                return false;

            // 确保目录存在
            string directory = Path.GetDirectoryName(filePath);
            if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
            {
                Directory.CreateDirectory(directory);
            }

            // 写入文件
            File.WriteAllText(filePath, json);
            Debug.Log("六边形网格数据已成功保存到: " + filePath);
            return true;
        }
        catch (Exception e)
        {
            Debug.LogError("保存 OptimizedHexGridCompatible 数据到文件时出错: " + e.Message);
            return false;
        }
    }
}

// 数据模型类，用于 JSON 序列化
[Serializable]
public class HexGridModel : IDataPack
{
    public List<HexCell> cells;

    // 无参构造函数（用于Delta更新）
    public HexGridModel()
    {
        cells = new List<HexCell>();
    }

    public HexGridModel(OptimizedHexGrid hexGrid)
    {
        cells = hexGrid.allCells;
    }
}

// 蜂窝单元类，包含中心点和熵值
[Serializable]
public class HexCell
{
    public Vector3 center;
    public float entropy;

    public HexCell(Vector3 c, float initialEntropy)
    {
        center = c;
        entropy = initialEntropy;
    }
}